package com.woniuxy.amusementparkos.controller.lsy;

import com.woniuxy.amusementparkos.dto.lvd.TableDataDto;
import com.woniuxy.amusementparkos.entity.lsy.Pos;
import com.woniuxy.amusementparkos.service.lsy.PosService;

import lombok.extern.slf4j.Slf4j;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

/**
 * 管理Pos机的控制器
 * @author Muzi
 * @since 2020-04-21 18:59:31
 */
@RestController
@RequestMapping("/pos")
@Slf4j// 使用日志
public class PosController {
    /**
     * 注入服务对象
     */
    @Autowired
    private PosService posService;
    
    @RequestMapping("/getbyip")
    @ResponseBody
    public Pos selectByIp(String pos_ip) {
    	return posService.getByIp(pos_ip);
    }

    /**功能：获得当前全部可用的POS机信息
     * 异常处理：仅需要统一异常处理
     * @return 返回POS机集合的json串
     */
    @RequestMapping("/getAll")
    @ResponseBody
    public TableDataDto<Pos> selectAllPos() {
    	List<Pos> mypos = posService.listAllPos();
    	TableDataDto<Pos> pos = new TableDataDto<>(0, "", 11L, mypos);
        return pos;
    }
    
    /**功能：通过一个POS机编码信息，获得POS机全部信息
     * 异常处理：仅需要统一异常处理
     * @return 返回单个POS机的json串
     */
    @RequestMapping("/getOneByPosId")
    @ResponseBody
    public Pos selectOnePosByPosId(String pos_id) {
    	Pos pos = posService.getOnePosById(pos_id);
        return pos;
    }

    /**功能：通过一个POS表主键，获得POS机全部信息
     * 异常处理：仅需要统一异常处理
     * @return 返回单个POS机的json串
     */
    @RequestMapping("/getOneByPK")
    @ResponseBody
    public Pos selectOnePosByPK(Integer id) {
    	Pos pos = posService.getOnePosByPKId(id);
        return pos;
    }
    
    
    /**功能：通过柜台编号，获得属于该柜台的POS机全部信息
     * 异常处理：仅需要统一异常处理
     * @return 返回所有符合条件POS机的json串
     */
    @RequestMapping("/getByCounter")
    @ResponseBody
    public List<Pos> selectPosByCounter(Integer counter_id) {
    	List<Pos> pos = posService.listAllPosByCounterId(counter_id);
        return pos;
    }
    
    /**功能：通过组织编号，获得属于该组织的POS机全部信息
     * 异常处理：仅需要统一异常处理
     * @return 返回所有符合条件POS机的json串
     */
    @RequestMapping("/getByOrg")
    @ResponseBody
    public List<Pos> selectPosByOrganization(Integer organization_id) {
    	List<Pos> pos = posService.listAllPosByOrganizationId(organization_id);
        return pos;
    }
    
    /**功能：添加POS机信息
     * 异常处理：仅需要统一异常处理
     * 	可能出现已存在编号的POS机重复添加异常。
     * @return 处理结果信息msg，和网页名等
     */
    @RequestMapping("/insertOne")
    public TableDataDto<Pos> addPos(Pos pos) {
    	//System.out.println(pos);
    	TableDataDto<Pos> result = new TableDataDto<>();
    	try {
    		//捕获添加时可能出现的异常
    		posService.insertOnePos(pos);	
		} catch (RuntimeException e) {
			result.setMsg("添加失败，POS机编号已存在");
			result.setCode(3);
			log.warn("pos控制器addPos操作异常："+e);
			return result;
		}
    	// 记录日志
    	log.info("POS机成功添加："+pos);
    	// 设置成功操作响应
    	result.setCode(1);
    	result.setMsg("添加成功");
    	return result;
    }
    
    /**功能：修改POS机信息
     * 异常处理：仅需要统一异常处理
     * 	可能出现不存在的编号的POS机进行修改的异常。
     * @return 处理结果信息msg，和网页名
     */
    @RequestMapping("/updateOne")
    public TableDataDto<Pos> updatePos(Pos pos) {
    	//System.out.println(pos);
    	TableDataDto<Pos> result = new TableDataDto<>();
    	try {
    		//捕获添加时可能出现的异常
    		posService.updateOnePosById(pos);	
		} catch (RuntimeException e) {
			result.setMsg(e.getMessage());
			result.setCode(3);
			//记录日志
			log.warn("Pos控制器updatePos操作异常："+e);
			return result;
		}
    	// 记录日志
    	log.info("成功将POS更新为："+pos);
    	// 设置成功操作响应
    	result.setMsg("修改成功");
    	result.setCode(1);
    	return result;
    }
    
    
    /**功能：删除POS机信息
     * 异常处理：仅需要统一异常处理
     * 	可能出现不存在的编号的POS机进行删除的异常。
     * @return 处理结果信息msg，和网页名
     * @throws Exception 
     */
    @RequestMapping("/deleteOne")
    public TableDataDto<Pos> deletePos(Integer id) throws Exception {
    	TableDataDto<Pos> result = new TableDataDto<>();
    	try {
    		//捕获添加时可能出现的异常
    		posService.deleteOnePosById(id);	
		} catch (RuntimeException e) {
			// 设置提示信息
			result.setMsg(e.getMessage());
			// 设置状态码
			result.setCode(3);
			// 记录日志
			log.warn("Pos控制器，deletePos操作不当，引起异常："+e);
			return result;
		}
    	// 记录日志
    	log.info("成功删除POS机，其编号为："+id);
    	// 设置成功操作响应
    	result.setMsg("删除成功");
		result.setCode(1);
    	return result;
    }
    
    @RequestMapping("/show")
    public ModelAndView showPos() {
    	return new ModelAndView("lsy/pos");
    }
    
    /**
     * 控制器统一异常处理器
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public TableDataDto<Integer> resolveException(Exception e){
    	// 创建对象
    	TableDataDto<Integer> result = new TableDataDto<>();
    	// 设置参数
    	result.setMsg("操作异常，请联系管理员");
    	// 记录日志
    	log.error("PosController发生严重异常："+e.getMessage()+e);
    	// 设置状态
		result.setCode(4);
    	return result;
    }
    
}